package com.liu.sunnyday.controller;

import com.liu.sunnyday.constant.MessageConstant;
import com.liu.sunnyday.constant.RedisMessageConstant;
import com.liu.sunnyday.entity.Result;
import com.liu.sunnyday.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * chance！Time
 *
 * @author liuqian
 * @date 2022-06-30 10:00
 * *
 */
@RestController
@RequestMapping("/validateCode")
public class ValidateCodeController {

    @Autowired
    private JedisPool jedisPool;

    @PostMapping("/send4Order")
    public Result send4Order(String telephone) {
        // 1 创建对象
        Jedis jedis = jedisPool.getResource();

        /**2：根据传来的电话号码，获取Redis中key是否存在，(redis获取的key为手机号)
         * 存在，(表示在一定时间内已经有发送验证码，并且该验证码还没失效）则抛出验证码已经发送请注意查收
         * 不存在，(表示还没发送验证码，或者验证码以销毁，需要重新发送）则获取新验证码，在redis中创建key，进行下一步操作
         *
         *  b,key的创建要加一个标识所以查询时我们也要拼接这个标识[RedisMessageCons_Otant.SENDTYPERDER+"_"]
         *  这个标识是自定义的(点进去看)001表示体检预约时的验证码
         *  为什么要有该标识(为了防止密码验证码，体检预约的验证码....,存入redis时key相同，混乱，找不到(redis获取的key为手机号)
         *  如密码的验证码是以电话号为key，而体检预约也是以电话号码为key，则冲突）
         *
         *  该string keyname是拼接的key名字方便去redis查注意不是表示是一个key！！现在先取名为keyname区分
         */
        String keyname = RedisMessageConstant.SENDTYPE_ORDER + "_" + telephone;

        // 3根据拼接的key名字去redis查，没有就需要获取一个验证码
        String exists_key = jedis.get(keyname);
        if (null == exists_key) {
            System.out.println("key==null");
            try {
                //3.1没有，在redis中创建key，进行下一步操作
                //获取验证码
                Integer code = ValidateCodeUtils.generateValidateCode(4);
                System.out.println(code);
                //存入redis
                jedis.setex(keyname, 1 * 40, code+"");
                return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS,code);
            } catch (Exception e) {
                e.printStackTrace();
                return new Result(true, MessageConstant.SEND_VALIDATECODE_FAIL);
            }
        }
        //System.out.println(exists_key+"22");
        //存在，(表示在一定时间内已经有发送验证码，并且该验证码还没失效）则抛出验证码已经发送请注意查收
        return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);
    }
}
